#include "CDeviceManager.h"

/**
 * Met à jours la position de la wand
 */
void CDeviceManager::updateWandPosition(float drawFactor)
{
	osg::Vec3 WandCurrentPosition(0,0,0);
	// On récupère les coordonnées de la wand
	const float units = drawFactor;
	gmtl::Matrix44f wand_mat(_Wand->getData(units));

	WandCurrentPosition.set(wand_mat[0][3],wand_mat[1][3],wand_mat[2][3]); // On récupère la position actuelle de la wand


	 // On calcule le mouvement effectué par la wand, uniquement si un objet est selectionné
	if(_recordWandMovement==true)
	{
		_wandMovement += (WandCurrentPosition-_wandPosition);
	}

	_wandPosition.set(WandCurrentPosition);
}


/**
 * Met à jours la position de la tête
 */
void CDeviceManager::updateHeadPosition(float drawFactor)
{
	osg::Vec3 HeadCurrentPosition(0,0,0);
	// On récupère les coordonnées de la wand
	const float units = drawFactor;
	gmtl::Matrix44f head_mat(_Head->getData(units));

	HeadCurrentPosition.set(head_mat[0][3],head_mat[1][3],head_mat[2][3]); // On récupère la position actuelle de la wand
	_headPosition.set(HeadCurrentPosition);
}

osg::Vec3 CDeviceManager::getWandMovement()
{
	osg::Vec3 retour;
	retour.set(_wandMovement[0],_wandMovement[1],_wandMovement[2]);
	_wandMovement.set(0,0,0);
	return retour;
}

CButton *CDeviceManager::getButton(int i)
{
	return _buttons[i];
}

/**
 * Récupère le temps écoulé depuis le dernier appel
 */
float CDeviceManager::getDeltaTime()
{
	// On synchronise les animations
	vpr::Interval current_frame = _Wand->getTimeStamp();
	vpr::Interval diff(current_frame-_last_frame);
	_last_frame = current_frame;
	// pour accéder au delta_t en microsecondes :
	return diff.secf();
}

/**
 * On update l'etat des devices
 */
void CDeviceManager::updateDevices(float drawFactor)
{
	updateHeadPosition(drawFactor);
	updateWandPosition(drawFactor);
}

/**
 * Méthode pour commencer le recording du mouvement
 */
void CDeviceManager::startRecordWandMovement()
{
	_recordWandMovement = true;
}

/**
 * Méthode pour stopper le recording du mouvement
 */
void CDeviceManager::stopRecordWandMovement()
{
	_recordWandMovement = false;
	_wandMovement.set(0,0,0);
}

/**
 * Rajoute un bouton
 */
void CDeviceManager::addButton(std::string name)
{
	_buttons.push_back(new CButton(name));
}

/**
 * Méthode d'initialisation
 */
void CDeviceManager::init()
{
	_recordWandMovement = false;
	const std::string head("VJHead");
	const std::string wand("VJWand");
	_Wand.init(wand);
	_Head.init(wand);
}

/**
 * Constructeur par défaut
 */
CDeviceManager::CDeviceManager()
{
}


/**
 * Déstructeur
 */
CDeviceManager::~CDeviceManager()
{
	_buttons.clear();
}

